Holen von Daten aus einem Remote-System
Mithilfe des Funktionsbausteins RFC_READ_TABLE können relativ problemlos Daten aus einem entfernten System geholt werden. Enthält die Tabelle jedoch ausser Character-Feldern auch Felder vom Typ Integer, decimals oder Floating-Point, dann gibt es Probleme. Wir zeigen Ihnen hier kurz, wie Sie das Problem einfach umgehen können.
Wenn Sie sich Daten aus einem entfernten System per Remote-Function-Call (RFC) besorgen möchten, dann nehmen Sie am einfachsten den Baustein RFC_READ_TABLE.
Sie können noch die Selektion einschränken und bestimmen, welche Felder aus der Tabelle übergeben werden sollen. Sie erhalten dann die Daten inklusive Beschreibung der Datenbanktabelle.
Wenn die Datenbanktabelle Felder vom Typ P, D, F oder I enthält, dann werden diese Felder nicht korrekt übergeben, da beim RFC eigentlich nur Felder vom Typ C übergeben werden können.
Als Lösung bieten sich drei Möglichkeiten an:
- Sie lesen die Daten in eine genügend breite Tabelle, die nur aus einem Character-Feld besteht. Danach weisen sie anhand der Feldinformationen mit Offset- und Längenangaben die Felder der eigentlichen Struktur zu.
- Sie schreiben sich einen eigenen RFC-Funktionsbaustein, der die Daten korrekt einliest. Der Vorteil hierbei ist, dass Sie direkt Einfluß auf die Where-Bedingung haben und diese nicht umständlich codieren müssen.
- Sie definieren sich eine Struktur, die nur aus Character-Feldern besteht, jedoch die selben Feldnamen enthält, wie die Datenbanktabelle.
Zu Lösung drei können Sie das folgende Programnm verwenden, um die Datendefinition ins Programm aufzunehmen. Es ermittelt die Felder einer Datenbanktabelle und erstellt daraus eine TYPES-Anweisung mit allen Feldern in der richtigen Länge im C-Format.
REPORT zz_rfc_types.
DATA gt_dd03l TYPE STANDARD TABLE OF dd03l.
FIELD-SYMBOLS <dd03l> TYPE dd03l.
DATA gv_name(80).
PARAMETERS p_tabl TYPE tabelle DEFAULT ‘VBAP’.
START-OF-SELECTION.
SELECT * FROM dd03l INTO TABLE gt_dd03l
WHERE tabname = p_tabl.
SORT gt_dd03l BY position.
WRITE: / ‘TYPES: BEGIN OF TY_RFC_’ NO-GAP, p_tabl NO-GAP, ‘,’.
LOOP AT gt_dd03l ASSIGNING <dd03l>.
gv_name = <dd03l>-leng.
SHIFT gv_name LEFT DELETING LEADING ‘0’.
CONCATENATE <dd03l>-fieldname ‘(‘ gv_name ‘)’ INTO gv_name.
WRITE: /10 gv_name, AT 36 ‘TYPE C,’.
ENDLOOP.
WRITE: / ‘ END OF TY_RFC_’ NO-GAP, p_tabl NO-GAP, ‘.’.
Die Ausgabe können Sie dann mithilfe STRG-Y und STRG-C in Ihr Coding übernehmen:
TYPES: BEGIN OF TY_RFC_VBAP ,
MANDT(3) TYPE C,
VBELN(10) TYPE C,
POSNR(6) TYPE C,
MATNR(18) TYPE C,
MATWA(18) TYPE C,
PMATN(18) TYPE C,
CHARG(10) TYPE C,
MATKL(9) TYPE C,
ARKTX(40) TYPE C,
PSTYV(4) TYPE C,
POSAR(1) TYPE C,
LFREL(1) TYPE C,
FKREL(1) TYPE C,
UEPOS(6) TYPE C,
GRPOS(6) TYPE C,
ABGRU(2) TYPE C,
PRODH(18) TYPE C,
ZWERT(13) TYPE C,
ZMENG(13) TYPE C,
ZIEME(3) TYPE C,
Hier noch ein kurzes Beispiel zum Einsatz in Ihren Programmen:
DATA gt_rfc_vbap TYPE STANDARD TABLE OF ty_rfc_vbap.
DATA gt_vbap TYPE STANDARD TABLE OF vbap.
FIELD-SYMBOLS <rfc_vbap> TYPE ty_rfc_vbap.
FIELD-SYMBOLS <vbap> TYPE vbap.
DATA gv_message TYPE text80.
DATA gt_opt TYPE STANDARD TABLE OF rfc_db_opt.
DATA gt_fld TYPE STANDARD TABLE OF rfc_db_fld.
CALL FUNCTION ‘RFC_READ_TABLE’
DESTINATION ‘SAP3’
EXPORTING
query_table = ‘VBAP’
TABLES
OPTIONS = gt_opt
fields = gt_fld
data = gt_rfc_vbap
EXCEPTIONS
table_not_available = 1
table_without_data = 2
option_not_valid = 3
field_not_valid = 4
not_authorized = 5
data_buffer_exceeded = 6
system_failure = 7 MESSAGE gv_message
communication_failure = 8 MESSAGE gv_message
OTHERS = 9.
IF sy-subrc <> 0.
WRITE: / ‘Fehler bei Aufruf RFC_READ_TABLE:’, sy-subrc, gv_message.
ELSE.
LOOP AT gt_rfc_vbap ASSIGNING <rfc_vbap>.
APPEND INITIAL LINE TO gt_vbap ASSIGNING <vbap>.
MOVE-CORRESPONDING <rfc_vbap> TO <vbap>.
ENDLOOP.
ENDIF.
TIPP:
Bei RFC-Aufrufen können Sie die beiden Ausnahmen “SYSTEM_FAILURE” und “COMMUNICATION_FAILURE” angeben. Dahinter noch eine Textvariable und Sie erhalten bei Kommunikationsproblemen detailierte Informationen!
- 7. December: Excel Racing Simulation – Root Vole Race - 7. Dezember 2024
- 5. December: ABAPConf - 5. Dezember 2024
- 4. December: Only a lazy developer is a good developer - 4. Dezember 2024